home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 July / macformat-026.iso / mac / Shareware City / Science / µSim 1.0 folder / Libs / SoundHandling.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-21  |  1.7 KB  |  70 lines  |  [TEXT/MMCC]

  1. #include    "FabTaskManager.h"
  2. #include    "SoundHandling.h"
  3.  
  4. static SndCallBackUPP    gmyCallbackUPP = nil;
  5. static unsigned short    gNumAsyncSnds = 0;
  6.  
  7. static pascal void myCallback(SndChannelPtr theChan, const SndCommand *sc);
  8. static void CloseSoundChannel(long sndChan);
  9. static void GetRidOfSndChannel(SndChannelPtr sndChan);
  10.  
  11. unsigned short GetSoundsRemaining(void)
  12. {
  13. return gNumAsyncSnds;
  14. }
  15.  
  16. void InitMySoundHandling(void)
  17. {
  18. gmyCallbackUPP = NewSndCallBackProc(myCallback);
  19. }
  20.  
  21. pascal void myCallback(SndChannelPtr theChan, const SndCommand *sc)
  22. {
  23. PROCCALLEDATINTERRUPTTIME((TMInfoPtr)sc->param2, (long)theChan);
  24. }
  25.  
  26. void DoSound(short sndResID)
  27. {
  28. SndCommand    mySndCmd;
  29. SndChannelPtr    mySndChan;
  30. SndListHandle    sndH;
  31.  
  32. mySndChan = (SndChannelPtr)NewPtr(sizeof(SndChannel));
  33. if (mySndChan) {
  34.     mySndChan->qLength = 4;
  35.     if (SndNewChannel(&mySndChan, 0, 0, gmyCallbackUPP) == noErr) {
  36.         if (sndH = (SndListHandle)Get1Resource('snd ', sndResID)) {
  37.             if (gNumAsyncSnds == 0)
  38.                 HLockHi((Handle)sndH);
  39.             mySndChan->userInfo = (long)sndH;
  40.             mySndCmd.cmd = callBackCmd;
  41.             mySndCmd.param2 = (long)NewPtr(sizeof(TMInfo));
  42.             if (mySndCmd.param2) {
  43.                 if (SndPlay(mySndChan, sndH, true) == noErr)
  44.                     gNumAsyncSnds++;
  45.                 InitTaskRecord(CloseSoundChannel, (TMInfoPtr)mySndCmd.param2);
  46.                 (void)SndDoCommand(mySndChan, &mySndCmd, true);
  47.                 }
  48.             else
  49.                 GetRidOfSndChannel(mySndChan);
  50.             }
  51.         else
  52.             GetRidOfSndChannel(mySndChan);
  53.         }
  54.     }
  55. }
  56.  
  57. void CloseSoundChannel(long sndChan)
  58. {
  59. if (--gNumAsyncSnds == 0)
  60.     HUnlock((Handle)((SndChannelPtr)sndChan)->userInfo);
  61. GetRidOfSndChannel((SndChannelPtr)sndChan);
  62. }
  63.  
  64. static void GetRidOfSndChannel(SndChannelPtr sndChan)
  65. {
  66. (void)SndDisposeChannel(sndChan, false);
  67. DisposePtr((Ptr)sndChan);
  68. }
  69.  
  70.